<?php
/**
 * 有序集合
 * @App	
 * @Group 
 * @Action SortSetTrait
 * @author lilei
 * @date 2018年5月25日
 * 
 */
namespace app\common\redis\traits;

trait SortSetTrait {
	/**
	 * Redis 操作句柄
	 * @var CacheRedis|Redis
	 */
	public $redis_handle ;
	
	/**
	 * 向有序集合添加数据
	 * @param string|number $item
	 * @param string|number $score
	 * @param string $key
	 */
	public function SortSetZadd ( $item, $score, $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->zAdd( $_key, $score, $item );
		return $res;
	}
	
	/**
	 * 向有序集合批量添加数据
	 * @param array $item_score 待添加元素的集合，每一项为array('val' => score)
	 * @param string $key
	 */
	public function SortSetZmadd ( array $item_score, $key='' ) {
		$_key = $key ?: $this->key;
		$p[] = $_key;
		foreach ($item_score as $k => $v){
			$p[] = $v;
			$p[] = $k;
		}
		//$res = $this->redis_handle->zAdd($p);
		$res = call_user_func_array(array($this->redis_handle, 'zadd'), $p);
		return $res;
	}
	
	/**
	 * 获取集合元素，从0位置 到 -1 位置 score 由低到高
	 * @param int $start
	 * @param int $end
	 * @param string $key
	 * @param string $is_assoc  true返回一个关联数组 带分数
	 * @return array
	 */
	public function SortSetZRange(  $start=0, $end=-1, $is_assoc=false, $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->zRange( $_key, $start, $end, $is_assoc );
		return $res;
	}
	
	/**
	 * 获取集合元素，从0位置 到 -1 位置，数组按照score降序处理
	 * @param int $start	开始位置
	 * @param int $end		结束位置
	 * @param string $is_assoc  true返回一个关联数组 带分数
	 * @param string $key
	 * @return array
	 */
	public function SortSetZRevRange( $start=0, $end=-1, $is_assoc=false, $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->zrevrange( $_key, $start, $end, $is_assoc );
		return $res;
	}
	
	/**
	 * 根据score获取集合元素，从0位置 到 -1 位置，数组按照score降序处理
	 * @param int $max	
	 * @param int $min
	 * @param int $start
	 * @param int $end
	 * @param string $is_assoc
	 * @param string $key
	 * @return array
	 */
	public function SrotSetZRevRangeByScore( $min, $max, $start=0, $end=-1, $is_assoc=false, $key='' ) {
		$_key = $key ?: $this->key;
		$param = array(
				'withscores' => $is_assoc,
				'limit' => array(
						$start,
						$end
				),
		);
		$res = $this->redis_handle->zRevRangeByScore( $_key, $max, $min, $param );
		return $res;
	}
	
	/**
	 * 获取集合元素个数
	 * @param string $key
	 * @return number
	 */
	public function SortSetSize( $key='' ) {
		$_key = $key ?: $this->key;
		$res = $this->redis_handle->zSize($_key);
		return $res;
	}


    /**
     *
     * @param $key
     * @param $item
     */
	public function ZScore( $key, $item )
    {
        return $this->redis_handle->zScore( $key , $item );
    }

    /**
     * 向有序集合某个item上增加number分数
     * @param string $key
     * @param $add_number
     * @param $item
     */
	public function ZIncrBy( $key = "", $add_number, $item )
    {
        return $this->redis_handle->zIncrBy( $key, $add_number, $item );
    }

    /**
     * 获取一个有序集合的排名
     */
    public function zRank( $number, $key  = "" )
    {
        return $this->redis_handle->zRank( $key, $number );
    }

    /**
     * 获取一个有序集合的排名
     */
    public function zRevRank( $number, $key  = "" )
    {
        return $this->redis_handle->zRevRank( $key, $number );
    }
	
}